🎖️GitЯра🎖️
feature/docs/build.gradle.kts 4d4070c8e1ed73a56ee2f054300a0f62e3fe2e62 (4d4070c8) Text, 5.56 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Te6edf3plugins Tb4b4b4{
Te6edf3aliasTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3pluginsTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3kmpTb4b4b4.Te6edf3featureTb4b4b4)
Te6edf3aliasTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3pluginsTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3kotlinxTb4b4b4.Te6edf3serializationTb4b4b4)
Te6edf3aliasTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3pluginsTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3kmpTb4b4b4.Te6edf3jvmTb4b4b4.Te6edf3androidTb4b4b4)
Tb4b4b4}
Te6edf3kotlin Tb4b4b4{
Te6edf3android Tb4b4b4{
Te6edf3namespace Tff7b72= Ta5d6ff"Ta5d6fforg.meshtastic.feature.docsTa5d6ff"
Te6edf3androidResourcesTb4b4b4.Te6edf3enable Tff7b72= Tff7b72true
Tb4b4b4}
Te6edf3sourceSets Tb4b4b4{
Te6edf3commonMainTb4b4b4.Te6edf3dependencies Tb4b4b4{
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3commonTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3navigationTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3resourcesTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3uiTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3projectsTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3diTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3kotlinxTb4b4b4.Te6edf3collectionsTb4b4b4.Te6edf3immutableTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3jetbrainsTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3material3Tb4b4b4.Te6edf3adaptiveTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3jetbrainsTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3material3Tb4b4b4.Te6edf3adaptiveTb4b4b4.Te6edf3navigation3Tb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3coilTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3markdownTb4b4b4.Te6edf3rendererTb4b4b4)
Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3markdownTb4b4b4.Te6edf3rendererTb4b4b4.Te6edf3m3Tb4b4b4)
Tb4b4b4}
Te6edf3commonTestTb4b4b4.Te6edf3dependencies Tb4b4b4{ Te6edf3implementationTb4b4b4(Te6edf3libsTb4b4b4.Te6edf3composeTb4b4b4.Te6edf3multiplatformTb4b4b4.Te6edf3uiTb4b4b4.Te6edf3testTb4b4b4) Tb4b4b4}
Te6edf3jvmTestTb4b4b4.Te6edf3dependencies Tb4b4b4{ Te6edf3implementationTb4b4b4(Te6edf3composeTb4b4b4.Te6edf3desktopTb4b4b4.Te6edf3currentOsTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e/**
* Sync task: copies markdown docs from the canonical `docs/` source directory into the CMP composeResources location.
* This eliminates manual content duplication and ensures the in-app bundled docs always reflect the source-of-truth.
*
* Usage: ./gradlew :feature:docs:syncDocsToComposeResources
*
* This task runs automatically before resource generation tasks.
*/
Tff7b72val Te6edf3syncDocsToComposeResources Tff7b72=
Te6edf3tasksTb4b4b4.Te6edf3registerTff7b72<Te6edf3SyncTff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffsyncDocsToComposeResourcesTa5d6ff"Tb4b4b4) Tb4b4b4{
Te6edf3description Tff7b72= Ta5d6ff"Ta5d6ffSyncs docs/en/ markdown source into composeResources for in-app bundlingTa5d6ff"
Te6edf3group Tff7b72= Ta5d6ff"Ta5d6ffdocsTa5d6ff"
T8b949e// isolated.rootProject: Isolated Projects forbids reaching through rootProject.layout.
Tff7b72val Te6edf3docsEnDir Tff7b72= Te6edf3isolatedTb4b4b4.Te6edf3rootProjectTb4b4b4.Te6edf3projectDirectoryTb4b4b4.Te6edf3dirTb4b4b4(Ta5d6ff"Ta5d6ffdocs/enTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3screenshotsDir Tff7b72= Te6edf3isolatedTb4b4b4.Te6edf3rootProjectTb4b4b4.Te6edf3projectDirectoryTb4b4b4.Te6edf3dirTb4b4b4(Ta5d6ff"Ta5d6ffdocs/assets/screenshotsTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3composeResourcesTarget Tff7b72= Te6edf3layoutTb4b4b4.Te6edf3projectDirectoryTb4b4b4.Te6edf3dirTb4b4b4(Ta5d6ff"Ta5d6ffsrc/commonMain/composeResources/files/docsTa5d6ff"Tb4b4b4)
Te6edf3fromTb4b4b4(Te6edf3docsEnDirTb4b4b4) Tb4b4b4{
Te6edf3includeTb4b4b4(Ta5d6ff"Ta5d6ffuser/**/*.mdTa5d6ff"Tb4b4b4)
Te6edf3includeTb4b4b4(Ta5d6ff"Ta5d6ffdeveloper/**/*.mdTa5d6ff"Tb4b4b4)
Tb4b4b4}
T8b949e// FR-038: Bundle screenshots into assets/screenshots/ to match markdown image paths.
T8b949e// docs/assets/screenshots/ is the tracked, semantically-named screenshot set shared with the
T8b949e// Jekyll site; copyDocsScreenshots refreshes it from the CST reference images, so the site and
T8b949e// the in-app reader always serve identical images (and raw CST renders never reach the bundle).
Te6edf3fromTb4b4b4(Te6edf3screenshotsDirTb4b4b4) Tb4b4b4{
Te6edf3includeTb4b4b4(Ta5d6ff"Ta5d6ff**/*.pngTa5d6ff"Tb4b4b4)
Te6edf3intoTb4b4b4(Ta5d6ff"Ta5d6ffassets/screenshotsTa5d6ff"Tb4b4b4)
Tb4b4b4}
Te6edf3intoTb4b4b4(Te6edf3composeResourcesTargetTb4b4b4)
T8b949e// Preserve timestamps for up-to-date checks
Te6edf3preserve Tb4b4b4{ Te6edf3includeTb4b4b4(Ta5d6ff"Ta5d6ff**/.gitkeepTa5d6ff"Tb4b4b4) Tb4b4b4}
Tb4b4b4}
T8b949e// Wire sync task to run before any resource generation
Te6edf3tasks
Tb4b4b4.Te6edf3matching Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffgenerateComposeResClassTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Tffa657itTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffcopyNonXmlValueResourcesTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Tffa657itTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffconvertXmlValueResourcesTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3configureEach Tb4b4b4{ Te6edf3dependsOnTb4b4b4(Te6edf3syncDocsToComposeResourcesTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3syncTranslatedDocsToComposeResources Tff7b72=
Te6edf3tasksTb4b4b4.Te6edf3registerTff7b72<Te6edf3CopyTff7b72>Tb4b4b4(Ta5d6ff"Ta5d6ffsyncTranslatedDocsToComposeResourcesTa5d6ff"Tb4b4b4) Tb4b4b4{
Te6edf3description Tff7b72= Ta5d6ff"Ta5d6ffSyncs Crowdin-translated docs into locale-qualified composeResourcesTa5d6ff"
Te6edf3group Tff7b72= Ta5d6ff"Ta5d6ffdocsTa5d6ff"
Tff7b72val Te6edf3docsDir Tff7b72= Te6edf3isolatedTb4b4b4.Te6edf3rootProjectTb4b4b4.Te6edf3projectDirectoryTb4b4b4.Te6edf3dirTb4b4b4(Ta5d6ff"Ta5d6ffdocsTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3targetBase Tff7b72= Te6edf3layoutTb4b4b4.Te6edf3projectDirectoryTb4b4b4.Te6edf3dirTb4b4b4(Ta5d6ff"Ta5d6ffsrc/commonMain/composeResources/filesTa5d6ff"Tb4b4b4)
Te6edf3fromTb4b4b4(Te6edf3docsDirTb4b4b4) Tb4b4b4{
T8b949e// Crowdin outputs dirs in Android qualifier format (fr, pt-rBR, zh-rCN)
Te6edf3includeTb4b4b4(Ta5d6ff"Ta5d6ff*/user/**/*.mdTa5d6ff"Tb4b4b4)
Te6edf3excludeTb4b4b4(Ta5d6ff"Ta5d6ffen/**Ta5d6ff"Tb4b4b4)
Te6edf3excludeTb4b4b4(Ta5d6ff"Ta5d6ff_*/**Ta5d6ff"Tb4b4b4)
Te6edf3excludeTb4b4b4(Ta5d6ff"Ta5d6ffassets/**Ta5d6ff"Tb4b4b4)
Te6edf3excludeTb4b4b4(Ta5d6ff"Ta5d6ffscreenshots/**Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Te6edf3intoTb4b4b4(Te6edf3targetBaseTb4b4b4)
T8b949e// Crowdin %android_code% already outputs CMP qualifier format (pt-rBR).
T8b949e// Locale goes as a subdirectory *inside* files/ (CMP doesn't support qualifiers on files/).
Te6edf3eachFile Tb4b4b4{
Tff7b72val Te6edf3segments Tff7b72= Te6edf3relativePathTb4b4b4.Te6edf3segments
Tff7b72if Tb4b4b4(Te6edf3segmentsTb4b4b4.Te6edf3size Tff7b72>Tff7b72= T79c0ff3Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3qualifier Tff7b72= Te6edf3segmentsTff7b72[T79c0ff0Tff7b72]
Tff7b72val Te6edf3rest Tff7b72= Te6edf3segmentsTb4b4b4.Te6edf3dropTb4b4b4(T79c0ff1Tb4b4b4)Tb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)
T8b949e// Output: files/{locale}/docs/user/page.md
T8b949e// English source lives at: docs/en/$rest
Te6edf3path Tff7b72= Ta5d6ff"Tffd700$Te6edf3qualifierTa5d6ff/docs/Tffd700$Te6edf3restTa5d6ff"
Tb4b4b4}
Tb4b4b4}
Te6edf3includeEmptyDirs Tff7b72= Tff7b72false
Tb4b4b4}
T8b949e// Wire translated docs sync to resource generation alongside the primary sync
Te6edf3tasks
Tb4b4b4.Te6edf3matching Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffgenerateComposeResClassTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Tffa657itTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffcopyNonXmlValueResourcesTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Tffa657itTb4b4b4.Te6edf3nameTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffconvertXmlValueResourcesTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3configureEach Tb4b4b4{ Te6edf3dependsOnTb4b4b4(Te6edf3syncTranslatedDocsToComposeResourcesTb4b4b4) Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.05s